package cn.dwy2002.binaryhandwritingserver.service.impl;

import cn.dwy2002.binaryhandwritingserver.common.Result;
import cn.dwy2002.binaryhandwritingserver.common.utils.RandomIdGenerator;
import cn.dwy2002.binaryhandwritingserver.exception.ProjectNotFoundException;
import cn.dwy2002.binaryhandwritingserver.exception.ServiceException;
import cn.dwy2002.binaryhandwritingserver.mapper.ProjectsMapper;
import cn.dwy2002.binaryhandwritingserver.pojo.dto.ProjectDTO;
import cn.dwy2002.binaryhandwritingserver.pojo.po.Project;
import cn.dwy2002.binaryhandwritingserver.pojo.vo.ProjectVO;
import cn.dwy2002.binaryhandwritingserver.service.service.ProjectService;
import cn.hutool.core.bean.BeanUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.Comparator;
import java.util.List;

import static cn.dwy2002.binaryhandwritingserver.common.Result.*;
import static cn.dwy2002.binaryhandwritingserver.common.utils.Utils.isEmptyOrNull;

/**
 * 项目管理
 *
 * @author 杜伟毅
 * @version 1.0
 * @since 2025/05/31
 */
@Service
@RequiredArgsConstructor
public class ProjectServiceImpl implements ProjectService {
    private final ProjectsMapper mapper;

    /**
     * 获取所有有效项目（未被逻辑删除的）
     *
     * @return 项目列表，按创建时间倒序排列
     * @throws ServiceException 当查询失败时抛出
     * @since 2025/5/28 0028 21:31
     */
    @Override
    public Result<List<ProjectVO>> listAllProjects() throws ServiceException {
        List<Project> projects = mapper.selectAll();
        // 按创建时间倒序排序（假设 Project 有 createTime 字段）
        projects.sort(Comparator.comparing(Project::getCreateTime).reversed());
        // 转换为 VO 对象
        List<ProjectVO> projectVOs = BeanUtil.copyToList(projects, ProjectVO.class);
        return success200("查询成功", projectVOs);
    }

    /**
     * 根据ID获取项目详情
     *
     * @param id 项目ID
     * @return 项目详情
     * @throws ProjectNotFoundException 当项目不存在时抛出
     * @throws ServiceException         当查询失败时抛出
     * @since 2025/5/28 0028 21:32
     */
    @Override
    public Result<ProjectVO> getProjectDetail(Long id) throws ProjectNotFoundException, ServiceException {
        if (id == null) {
            throw new IllegalArgumentException("项目ID不能为空");
        }

        Project project = mapper.selectById(id);
        if (project == null) {
            return fail400("项目不存在");
        }

        ProjectVO projectVO = BeanUtil.copyProperties(project, ProjectVO.class);
        return success200("查询成功", projectVO);
    }

    /**
     * 创建新项目
     *
     * @param dto 项目数据（无需包含ID）
     * @return 创建成功的项目对象（包含生成的ID）
     * @since 2025/5/28 0028 21:33
     */
    @Override
    public Result<Void> createProject(ProjectDTO dto) {
        // 1. 检查DTO是否有效
        if (dto == null) {
            return fail400("项目数据不能为空");
        }
        if (isEmptyOrNull(dto.getName())) {
            return fail400("项目名称不能为空");
        }
        if (isEmptyOrNull(dto.getDescription())) {
            return fail400("项目描述不能为空");
        }

        // 2. 生成ID并插入数据库
        Project project = BeanUtil.copyProperties(dto, Project.class);
        project.setId(RandomIdGenerator.generateId());
        mapper.insert(project);

        return success201("项目创建成功");
    }

    /**
     * 更新项目信息
     *
     * @param dto 项目更新数据（必须包含有效ID）
     * @return 更新后的项目对象
     * @throws ProjectNotFoundException 当项目不存在时抛出
     * @since 2025/5/28 0028 21:34
     */
    @Override
    public Result<Void> updateProject(ProjectDTO dto) throws ProjectNotFoundException {
        // 1. 检查DTO是否有效
        if (dto == null || dto.getId() == null) {
            return fail400("项目ID不能为空");
        }

        // 2. 查询项目是否存在
        Project existingProject = mapper.selectById(dto.getId());
        if (existingProject == null) {
            return fail400("项目不存在");
        }

        // 3. 更新项目信息
        Project project = BeanUtil.copyProperties(dto, Project.class);

        mapper.update(project);

        return success201("项目更新成功");
    }

    /**
     * 删除项目（逻辑删除）
     *
     * @param id 项目ID
     * @throws ProjectNotFoundException 当项目不存在时抛出
     * @since 2025/5/28 0028 21:35
     */
    @Override
    public Result<Void> deleteProject(Long id) throws ProjectNotFoundException {
        // 1. 检查ID是否有效
        if (id == null) {
            return fail400("项目ID不能为空");
        }

        // 2. 查询项目是否存在
        Project existingProject = mapper.selectById(id);
        if (existingProject == null) {
            return fail400("项目不存在");
        }

        // 3. 执行逻辑删除
        mapper.deleteById(id);

        return success201("项目删除成功");
    }
}
